package java_thinking.unit_13._13_6;

import java.util.Arrays;

/**
 * @Description : 正则表达式
 *              1.要找一个数字，它可能有一个符号在最前面：-?
 *              2.\\表示我要插入一个正则表达式的反斜线，如果只是为了的要插入反斜杠\\\\
 *              3.表示一个或多个之前的表达式可使用+，要表示"可能有一个负号，后面跟着一位或多位数字"
 *              可以这样：-?\\d+
 *              4.竖线|表示或操作
 *              5.加号匹配\\+
 *              6.\W    表示非单词字符
 *              7.\w+   表示一个单词字符(相邻都是字母)(见java_thinking/unit_13/_13_6/Finding.java:14)
 *              7.\w    表示一个字符
 *              8.XY    Y跟在X后
 *              9.X|Y   X或Y
 *              10.(X)  捕获组，可以在表达式中用\i引用第i个捕获组
 *              11.^    一行的开始
 *              12.$    一行的结束
 *              13.\b   词的边界
 *              14.\B   非词的边界
 *              15.\G   前一个匹配的结束
 *
 *              贪婪型         勉强型         占有型         如何匹配
 *              X?              X??             X?+         一个或零个X
 *              X*              X*?             X*+         零个或多个X
 *              X+              X+?             X++         一个或多个X
 *              X{n}            X{n}?           X{n}+       恰好n次X
 *              X{n,}           X{n,}?          X{n,}+      至少n次X
 *              X{n,m}          X{n,m}?         X{n,m}+     X至少n次，且不超过m次
 * @author: cww
 * @DateTime: 2019-03-24 23:20
 */

public class IntegerMatch {
    public static void main(String[] args) {
        System.out.println("-1234".matches("-?\\d+"));
        System.out.println("5678".matches("-?\\d+"));
        System.out.println("+911".matches("-?\\d+"));
        //可能以一个加号或者减号开头，或者都没有因为后面带着问号
        //因为+号在正则表达式中有特殊的意义说以必须使用\\将其转义
        System.out.println("+911".matches("(-|\\+)?\\d+"));
        System.out.println("=========");
        //包含a、b、c任何字符（只匹配一位！）
        System.out.println("b".matches("[abc]"));
        System.out.println("bb".matches("[abc]+"));
        System.out.println("bb".matches("[abc]"));
        System.out.println("除了abc外的任何字符");
        System.out.println("A".matches("[^abc]"));
        System.out.println("AA".matches("[^abc]+"));

        System.out.println("从a-z/A-Z任何字符(范围)");
        System.out.println("\"A\".matches(\"[a-zA-Z]\") "+"A".matches("[a-zA-Z]"));
        System.out.println("\"AA\".matches(\"[a-zA-Z]\") "+"AA".matches("[a-zA-Z]"));
        System.out.println("\"AA\".matches(\"[a-zA-Z]+\") "+"AA".matches("[a-zA-Z]+"));
        System.out.println("任意a、b、c、h、i、j 字符(与a|b|c|h|i|j)作用相同 合并");
        System.out.println("\"i\".matches(\"[abc[hij]]\") "+"i".matches("[abc[hij]]"));
        System.out.println("\"i\".matches(\"[abc[hij]]\") " + "bbij".matches("[abc]+[hij]+"));
        System.out.println("任意h、i或j (a~z与hij的交集)");
        System.out.println("\"j\".matches(\"[a-z&&[hij]]\") "+"j".matches("[a-z&&[hij]]"));
        System.out.println("\"ij\".matches(\"[a-z&&[hij]]\") "+"ij".matches("[a-z&&[hij]]+"));
        System.out.println("空白符(空格、tab、换行、换页和回车)");
        System.out.println("\"\\n\".matches(\"\\\\s\") "+"\n".matches("\\s"));
        System.out.println("非空白字符");
        System.out.println("\" \".matches(\"\\\\S\") "+" ".matches("\\S"));
        System.out.println("数字[0-9]");
        System.out.println("\"9\".matches(\"\\\\d\") "+"9".matches("\\d"));
        System.out.println("\"9\".matches(\"[0-9]\") "+"9".matches("[0-9]"));
        System.out.println("非数字 ");
        System.out.println("\"a\".matches(\"\\\\D\") "+"a".matches("\\D"));
        System.out.println("\"a\".matches(\"[^0-9]\") "+"a".matches("[^0-9]"));
        System.out.println("词字符[a-zA-z0-9]");
        System.out.println("\"d\".matches(\"\\\\w\") "+"d".matches("\\w"));
        System.out.println("非词字符[^\\W]");
        System.out.println("word".matches("\\W+"));

    }
}


class Splitting {
    public static String knights =
            "Then, when you have found the shrubbery, you must cut down the mightiest list in the forest... ith... a herring!";

    public static void split(String regex) {
        System.out.println(Arrays.toString(knights.split(regex)));
    }

    public static void main(String[] args) {
        // Doesn't have to contain regex chars
        split(" ");
        // Non-word characters 非单词的字符匹配
        split("\\W+");
        // 'n' followed by non-word characters 字母n后面跟着的一个或多个非单词字符
        split("n\\W+");
    }
}

class Replacing {
    static String s = Splitting.knights;

    public static void main(String[] args) {
        //f开头，后面跟着一个 或多个字母
        System.out.println(s.replaceFirst("f\\w+","located"));
        System.out.println(s.replaceAll("shrubbery|tree|herring","banana"));
    }
}
